Back To The Mac을 쓰는 기분이네요. 이런 프로젝트를 소개할 때는 말이죠.
화면의 밝기를 조절해 주는 Mac용 앱 프로젝트 입니다.
“자동으로 밝기 조절” 옵션을 disable 해 줘야 제대로 작동합니다.
2016/08/01 Today’s Best
anishathalye/lumen
_lumen - Magic auto brightness based on screen contents :bulb:_github.com
설치
기본적으로 binary를 제공합니다.
공식사이트에서
Lumen: Magic Auto Brightness Based on Screen Contents
_I do most of my software development in my terminal, with my trusty tmux / zsh / vim setup. When coding, I frequently…_www.anishathalye.com
다운로드 받아서 설치할 수 있습니다.
실행
실행하면 바로 MacOS의 status Bar에 해당 어플리케이션이 설치되고 Main Display 의 화면을 분석해서 색깔을 조절합니다.
소스 보기
anishathalye/lumen
_lumen - Magic auto brightness based on screen contents :bulb:_github.com
BrightnessController.m 파일이 대부분의 기능을 담당하고 있습니다.
AppDelegate.m 파일의 applicationDidFinishLaunching 을 살펴보면
- (void)applicationDidFinishLaunching:(NSNotification \*)aNotification {
self.statusItem = \[\[NSStatusBar systemStatusBar\] statusItemWithLength:NSVariableStatusItemLength\];
\[self.statusItem setMenu:self.statusMenu\];
\[self.statusItem setTitle:MENU\_SYMBOL\];
\[self.statusItem setHighlightMode:YES\];
self.brightnessController = \[\[BrightnessController alloc\] init\];
\[self.brightnessController start\];
\[self.toggle setTitle:STOP\];
}
brightnessController start
함수를 콜 하게 됩니다.
이 함수는 타이머를 실행시키는데 이 대부분이 링크 BrightnessController.m 파일에 작성되어 있죠.
타이머가 콜하는 tick은
(void)tick:(NSTimer \*)timer {
// 스크린의 밝기를 얻고
CGImageRef contents = \[self getScreenContents\];
if (!contents) {
return;
}
double lightness = \[self computeLightness:contents\];
CFRelease(contents);
// 백라이트가 수동으로 설정되었는지 확인한 후에
static bool noticed = false;
static float lastNoticed = 0;
float setPoint = \[self getBrightness\];
if (noticed || fabsf(self.lastSet --- setPoint) \> CHANGE\_NOTICE) {
if (!noticed) {
noticed = true;
lastNoticed = setPoint;
return; // 계속 바뀌는 치 체크
}
if (fabsf(setPoint --- lastNoticed) \> CHANGE\_NOTICE) {
lastNoticed = setPoint;
return; // it's still changing
} else {
\[self.model observeOutput:setPoint forInput:lightness\];
noticed = false;
// don't return, fall through and evaluate model here
}
}
float brightness = \[self.model predictFromInput:lightness\];
\[self setBrightness:brightness\];
}
마지막으로 계산된 값으로 밝기를 셋팅합니다.
관련된 계산식은 computeLightness 에 작성되어 있습니다.
double brightness = 0;
const unsigned int kSkip = 16; // uniformly sample screen pixels
// find RMS brightness value
if (data) {
for (size\_t y = 0; y < height; y += kSkip) {
for (size\_t x = 0; x < width; x += kSkip) {
const unsigned char \*dptr = &data\[(width \* y + x) \* 4\];
double l = srgb\_to\_brightness(dptr\[0\], dptr\[1\], dptr\[2\]);
brightness += l \* l;
}
}
}
**brightness = sqrt(brightness / (width \* height / (kSkip \* kSkip)));**
오늘은 왠일로 소스 분석까지 해 버렸네요. 아이쿵.
이런 코드 너무 좋아요~
By Keen Dev on August 1, 2016.
Exported from Medium on May 31, 2017.